/*
 * Progetto PPS2012 - seegwords
 *
 * Ettore Chimenti
 * Giuliano De Angelis
 * 
 * @02.2013
 * 
 * 4) Realizzare un mini motore di ricerca, implementato attraverso una lista inversa:
 * http://en.wikipedia.org/wiki/Inverted_index
 * 
 * Leggere un insieme di documenti .txt da una directory. Si crei una classe MotoreDiRicerca che 
 * permette di effettuare ricerche efficienti realizzando una lista inversa.
 * In particolare, la classe prende i documenti e crea una la lista inversa:
 * parola->lista_documenti_che_la_contengono
 * 
 * Implementare un metodo Search che prende in ingresso una stringa e ritorna un vettore di documenti.
 * In particolare, il metodo Search separa la stringa in un insieme di parole. I documenti ritornati 
 * sono trovati intersecando le liste relative alle parole. 
 * 
 */
#include<iostream>
#include<map>
#include<set>
#include<string>
#include<vector>
#include<algorithm>					//set_intersection, ecc..
#include "./Word.h"

using namespace std;

const set<int>&	And::GetDocs	 (){return *docs;}
const set<int>&	Or:: GetDocs	 (){return *docs;}
const set<int>& Not::GetDocs	 (){return *docs;}	

void 		And::Operation	 (set<int>& result){
  set<int> tmp;
  set_intersection(docs->begin(), docs->end(), 
		   result.begin(), result.end(), 
		   inserter(tmp,tmp.begin()));
  result = tmp;
}

void 		Or:: Operation	 (set<int>& result){
  result.insert(docs->begin(),docs->end());
}

void 		Not::Operation	 (set<int>& result){
  set<int> tmp;
  set_difference(result.begin(), result.end(),
		 docs->begin(), docs->end(),  
		 inserter(tmp,tmp.begin()));
  result = tmp;
}

And::~And(){ if(docs != NULL) delete docs; }
Or::~Or(){   if(docs != NULL) delete docs; }
Not::~Not(){ if(docs != NULL) delete docs; }